void bdNetImpl::stop()
{
	if (bdConnectionStore::BD_CONNECTION_STORE_UNINITIALIZED != m_connectionStore.getStatus())
		m_connectionStore.startShutdown(bdConnectionStore::BD_CONNECTION_STORE_SHUTDOWN_IMMEDIATE);

	if (bdUPnP::BD_UPNP_UNINITIALISED != m_UPnP.getStatus())
		m_UPnP.startShutdown(bdUPnP::BD_UPNP_SHUTDOWN_IMMEDIATE);

	if (NULL != m_socketRouter)
	{
		m_socketRouter->quit();
		delete m_socketRouter;
		m_socketRouter = BD_NULL;
	}

	if(BD_NULL != m_params.m_socket)
	{
		const bdBool socketCloseResult = m_params.m_socket->close();
		if(false == socketCloseResult)
		{
			BD_WARN(BD_LOG_LEVEL, "Game socket failed to close with an error");
		}
		delete m_params.m_socket;
		m_params.m_socket = BD_NULL;
	}

	if (m_ipDiscClient)
	{
		m_ipDiscClient->quit();
		delete m_ipDiscClient;
		m_ipDiscClient = BD_NULL;
	}
	if (m_natTypeDiscClient)
	{
		m_natTypeDiscClient->quit();
		delete m_natTypeDiscClient;
		m_natTypeDiscClient = BD_NULL;
	}

	if(m_getHostByName)
	{
		// Host name lookup code should be quited to avoid memory leak.
		// It is safe to call quit more than once.
		m_getHostByName->quit();
		delete m_getHostByName;
		m_getHostByName = BD_NULL;
	}

	m_status = BD_NET_STOPPED;
	m_currentNatTravAddrIndex = 0;
	m_currentNatTravHostIndex = 0;
	m_params.m_localAddresses.clear();
	m_params.m_natTravHosts.clear();
	m_natTravAddrs.clear();
}